from django.conf import settings
from django.core.files.storage import Storage
from django.utils.deconstruct import deconstructible
from fdfs_client.client import Fdfs_client


@deconstructible
class FastDFSStorage(Storage):
    """利用官方文档来定义"""

    def __init__(self, base_url=None, client_conf=None):
        """
        初始化
        :param base_url: 用于构造图片完整路径使用，图片服务器的域名
        :param client_conf: FastDFS客户端配置文件的路径
        """
        # 传入配置文件.有就用传入的,没有就用全局的
        if base_url is None:
            base_url = settings.FDFS_URL
        self.base_url = base_url

        if client_conf is None:
            client_conf = settings.FDFS_CLIENT_CONF
        self.client_conf = client_conf


    # 必须要定义,但是我们不用,所以pass
    def _open(self, name, mode='rb'):
        pass

    # 主要用到save
    def _save(self, name, content):
        """
        在FastDFS中保存文件
        :param name: 传入的文件名
        :param content: 文件对象
        :return: 保存到数据库中的FastDFS的文件名
        """
        client = Fdfs_client(self.client_conf)

        # 文件名一般拿不到,拿文件的内容
        ret = client.upload_by_buffer(content.read())

        # 返回内容{'Local file name': '/home/python/Desktop/meiduo/meiduo_mall/scripts/sss.npg', 'Uploaded size': '13.00KB', 'Group name': 'group1', 'Remote file_id': 'group1/M00/00/00/wKgfiFv1EbWAdPJwAAA0n7zlTQk835.npg', 'Storage IP': '192.168.31.136', 'Status': 'Upload successed.'}

        if ret.get("Status") != "Upload successed.":
            raise Exception("upload file failed")

        file_name = ret.get("Remote file_id")
        # save方法返回什么东西,会自动往数据库中写入
        return file_name

    # 获取网址前缀,用来拼接
    def url(self, name):
        """
        返回文件的完整URL路径
        :param name: 数据库中保存的文件名
        :return: 完整的URL
        """
        return self.base_url + name


    # 在调用save方法之前会先调用exists方法,必须要,不关心.
    # fdfs会给我们解决
    def exists(self, name):
        """
        判断文件是否存在，FastDFS可以自行解决文件的重名问题
        所以此处返回False，告诉Django上传的都是新文件
        :param name:  文件名
        :return: False
        """
        return False